<?php
require_once ("view/View.php");

abstract class Controller
{
	// L'oggetto view, associato a questo controller
	protected $_view;
	
	// La view associata al controller segue le stesse naming convention del controller, ad eccezione di:
	// - tutti i caratteri nel nome della view sono in minuscolo
	// - l'estensione del file è ".phtml"
	// - il file si trova nella cartella "view"
	public function __construct() {
		$this->_view = new View('view/' . strtolower(str_replace('Controller', '', get_class($this))) . '.phtml');
	}
	
	/*
	 * void dispatch ( void )
	 * Metodo invocato da MVCApplication per avviare il controller e
	 * disegnarne l'output (view) a video
	 */
	public function dispatch() { 
		$this->run();
		if (!is_null($this->_view)) $this->render();
	}
	
	/* void run ( void )
	 * Punto di ingresso nel controller
	 * E' il metodo che contiene la logica applicativa di questo controller
	 * Deve essere implementato da ogni controller
	 */
	public abstract function run();
	
	/*
	 * void render ( void )
	 * Disegna su stdout la view di questo controller
	 */
	public final function render() { 
		$this->_view->render();
	}
	
	/*
	 * HTTPRequest _getRequest ( void )
	 * Metodo helper, ritorna l'oggetto HTTPRequest (membro statico di MVCApplication) 
	 */
	protected function _getRequest() {
		return MVCApplication::getRequest();
	}
	
	/*
	 * void _setNoRender ( void )
	 * Disattiva la view (e quindi l'output a video) di questo controller
	 */
	protected function _setNoRender() {
		$this->_view = null;
	}
	
	/*
	 * void _redirect (string $destination, array $params)
	 * Redirige il flusso dell'applicazione verso un nuovo controller
	 * Il controller destinazione riceve in ingresso gli eventuali
	 * parametri passati come secondo argomento (disponibili in 
	 * HTTPRequest::getParams())
	 */
	protected function _redirect($destination, $params = array()) {
		header('Location: /' . MVCApplication::getRoute()->getAppname() . "/" . $destination . "?" . http_build_query($params));
	}
}